<?php
    //1.定义命名空间与本文件所在目录层级相同（houdunwang/view）
    //2.因为composer自动载入类的需要
    //3.命名空间namespace之前不能有输出！
    namespace houdunwang\view;
    //1.定义基类（最基本通用的类）
    //2.经过View类中的__call及__callStatic方法将在该类中寻找View类中不存在的方法
    //3.目前包含组合模板路径字符串的方法make()、传递参数with()、载入模板的方法__toString()
    class Base{
        //定义存储模板路径字符串的私有属性
        private $tpl;
        //定义接收外部传入进来的参数的私有属性
        //设置默认为空数组
        //（在没有执行with()方法传参时避免出现错误：因为__toString()方法中用到了extract()方法）
        private $args = [];

        //1.定义组合模板文件路径字符串的函数
        //2.在Entry类中index方法中的链式调用
        public function make(){
            //1.组合模板文件的路径供__toString方法引入模板
            //2.入口文件index.php位于public目录中，需要往上返回一层因此需要加上"../"
            $this->tpl = "../app/".MODULE."/view/".CONTROLLER."/".ACTION.".php";
            //1.返回当前对象
            //2.供Entry类中的index方法链式调用该类中的其它方法
            return $this;
        }

        //1.定义赋值外部传来参数的函数
        //2.在Entry类中index方法中的链式调用
        public function with($data){
            //1.将Entry类中index方法传递过来的参数存储在私有属性$args中
            //2.用于__toString()（载入模板）方法的还原变量格式（extract()）
            $this->args = $data;
            //1.返回当前对象
            //2.供Entry类中的index方法链式调用该类中的其它方法
            return $this;
        }

        //1.定义用于载入模板文件的函数
        //2.在Entry类index方法中经过echo 当前对象而实现载入模板
        //（因为__toString当遇到echo 对象时会自动触发）
        public function __toString(){
            //1.将传递进来的参数（压缩过compact()）抽取出来还原回来
            //2.供模板文件中显示这些参数值
            extract($this->args);
            //载入模板文件显示页面
            include $this->tpl;
            //1.__toString方法必须返回一个字符串
            //2.因此需要填写一个字符串（空即可）
            return "";
        }

    }